/*
 *  Copyright (C) 2010 Glauco
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package org.balisunrise.common;

import org.balisunrise.annotation.FilterType;

/**
 * Esta interface representa um objeto que pode retornar um Criterion.
 * @author Glauco
 * @version 1.0
 * @see org.balisunrise.common.Criterion
 */
public interface Criterionable {

    /**
     * Retorna um Criterion.
     * @return Retorna um Criterion.
     */
    public Criterion getCriterion();

    /**
     * Atribui o tipo de filtro que será usado pelo Criterion
     *
     * @param filterType
     */
    public void setFilterType(FilterType filterType);

    /**
     * Prefixo do nome do campo do filtro.
     * É utilizado para filtrar atravéz de campos encapsulados por entidades
     * de entidades.
     * Por Exemplo:
     * A Classe Estado tem uma referencia a Pais, então para filtrar os
     * estados pelo nome do pais usariamos "pais.nome" onde "nome" seria o
     * campo e "pais" seria o pré-name.
     *
     * @param prefix Prefixo para ser utilizado como preNames na construção do
     * Criterion.
     */
    public void addPrefix(String prefix);

    /**
     * Atribui se emptyForAll para o Criterion
     *
     * @param emptyForAll
     */
    public void setEmptyForAll(boolean emptyForAll);

    /**
     * Verifica se os valores do filtro foram modificados desde a última
     * chamada getCriterion().
     */
    public boolean isModified();
}